/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.notifying.unread;

import java.io.IOException;
import java.io.Writer;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import pittypat.DataList;
import pittypat.INotification;

/**
 * 表示一条通知消息。
 */
final class Notification implements INotification {
	// 一个空的通知消息列表。
	private static final List<INotification> EMPTY_LIST = new ArrayList<>();

	/**
	 * 将数据服务中查询到的通知列表转换为 Notification 表示的通知列表。
	 * 
	 * @param list
	 *            来自数据服务的通知列表。
	 * @return 由 Notification 构成的通知列表。
	 */
	public static List<INotification> From(DataList<com.waln.notifying.unread.data.Notification> list) {
		if (list == null || list.size() == 0) {
			return EMPTY_LIST;
		}

		List<INotification> items = new ArrayList<INotification>(list.size());

		for (com.waln.notifying.unread.data.Notification item : list) {
			items.add(new Notification(item));
		}

		return items;
	}

	private com.waln.notifying.unread.data.Notification not;

	/**
	 * 使用从数据服务中查询到的通知消息初始化 Notification 的新实例。
	 */
	private Notification(com.waln.notifying.unread.data.Notification not) {
		this.not = not;
	}

	/**
	 * 获取通知的 Id。
	 * 
	 * @return 通知的 Id。
	 */
	@Override
	public UUID getId() {
		return this.not.id;
	}

	/**
	 * 获取通知发送人的名称。
	 * 
	 * @return 通知发送人的名称。
	 */
	@Override
	public String getSenderName() {
		return this.not.senderName;
	}

	/**
	 * 获取通知发送人的头像文件的路径。
	 * 
	 * @return 通知发送人的头像文件的路径。
	 */
	@Override
	public String getSenderFaceUrl() {
		return this.not.senderFaceUrl;
	}

	/**
	 * 获取通知的接收时间。
	 * 
	 * @return 通知的接收时间。
	 */
	@Override
	public LocalDateTime getReceiveTime() {
		return this.not.receiveTime;
	}

	/**
	 * 获取通知的紧急程度代码：1-常规，2-紧急，3-特急。
	 * 
	 * @return 通知的紧急程度代码：1-常规，2-紧急，3-特急。
	 */
	@Override
	public byte getUrgency() {
		return this.not.urgency;
	}

	/**
	 * 获取通知的分组名称。
	 * 
	 * @return 通知的分组名称。
	 */
	@Override
	public String getGroup() {
		return this.not.group;
	}

	/**
	 * 获取通知的标题。
	 * 
	 * @return 通知的标题。
	 */
	@Override
	public String getTitle() {
		return this.not.title;
	}

	/**
	 * 获取通知的内容摘要。
	 * 
	 * @return 通知的内容摘要。
	 */
	@Override
	public String getSummary() {
		return this.not.summary;
	}

	/**
	 * 获取通知的功能路径。
	 * 
	 * @return 通知的功能路径。
	 */
	@Override
	public String getFuncUrl() {
		return this.not.funcUrl;
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 *            目标文本流。
	 * @throws IllegalArgumentException
	 *             writer 为 null。
	 * @throws IOException
	 */
	@Override
	public void write(Writer writer) throws IOException {
		this.not.write(writer);
	}
}
